Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/fountain/FountainCodec.kt e249461e3c77e41a3928c01537da0a173c687621 (e249461e) Text, 16.45 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.core.takserver.fountain

Tff7b72import T7ee787co.touchlab.kermit.Logger
Tff7b72import T7ee787kotlin.math.ceil
Tff7b72import T7ee787kotlin.math.ln
Tff7b72import T7ee787kotlin.math.sqrt
Tff7b72import T7ee787kotlin.random.Random
Tff7b72import T7ee787kotlin.time.Clock

Tff7b72internal Tff7b72object T56d364FountainConstants Tb4b4b4{
Tff7b72val Te6edf3MAGIC Tff7b72= Te6edf3byteArrayOfTb4b4b4(T79c0ff0Te6edf3x46Tb4b4b4, T79c0ff0Te6edf3x54Tb4b4b4, T79c0ff0Te6edf3x4ETb4b4b4) T8b949e// "FTN"
Tff7b72const Tff7b72val Te6edf3BLOCK_SIZE Tff7b72= T79c0ff2T79c0ff2T79c0ff0
Tff7b72const Tff7b72val Te6edf3DATA_HEADER_SIZE Tff7b72= T79c0ff1T79c0ff1
Tff7b72const Tff7b72val Te6edf3FOUNTAIN_THRESHOLD Tff7b72= T79c0ff2T79c0ff3T79c0ff3
Tff7b72const Tff7b72val Te6edf3TRANSFER_TYPE_COTTb4b4b4: Tffa657Byte Tff7b72= T79c0ff0Te6edf3x00
Tff7b72const Tff7b72val Te6edf3ACK_TYPE_COMPLETETb4b4b4: Tffa657Byte Tff7b72= T79c0ff0Te6edf3x02
Tff7b72const Tff7b72val Te6edf3ACK_PACKET_SIZE Tff7b72= T79c0ff1T79c0ff9
Tb4b4b4}

Tff7b72internal Tff7b72data Tff7b72class T56d364FountainBlockTb4b4b4(
Tff7b72val Te6edf3seedTb4b4b4: Tffa657IntTb4b4b4, T8b949e// UInt16
Tff7b72var Te6edf3indicesTb4b4b4: Te6edf3MutableSetTff7b72<Tffa657IntTff7b72>Tb4b4b4,
Tff7b72var Te6edf3payloadTb4b4b4: Te6edf3ByteArrayTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffequalsTb4b4b4(Te6edf3otherTb4b4b4: Tffa657Any?Tb4b4b4)Tb4b4b4: Tffa657Boolean Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72this Tff7b72=Tff7b72=Tff7b72= Te6edf3otherTb4b4b4) Tff7b72return Tff7b72true
Tff7b72if Tb4b4b4(Te6edf3other Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Tff7b72thisTff7b72::Tff7b72class != T56d364otherTff7b72::Te6edf3classTb4b4b4) Tff7b72return Tff7b72false
Te6edf3other Tff7b72as Te6edf3FountainBlock
Tff7b72return Te6edf3seed Tff7b72=Tff7b72= Te6edf3otherTb4b4b4.Te6edf3seed Tff7b72&Tff7b72& Te6edf3indices Tff7b72=Tff7b72= Te6edf3otherTb4b4b4.Te6edf3indices Tff7b72&Tff7b72& Te6edf3payloadTb4b4b4.Te6edf3contentEqualsTb4b4b4(Te6edf3otherTb4b4b4.Te6edf3payloadTb4b4b4)
Tb4b4b4}

Tff7b72override Tff7b72fun Td2a8ffhashCodeTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657Int Tb4b4b4{
Tff7b72var Te6edf3result Tff7b72= Te6edf3seed
Te6edf3result Tff7b72= T79c0ff3T79c0ff1 Tff7b72* Te6edf3result Tff7b72+ Te6edf3indicesTb4b4b4.Te6edf3hashCodeTb4b4b4(Tb4b4b4)
Te6edf3result Tff7b72= T79c0ff3T79c0ff1 Tff7b72* Te6edf3result Tff7b72+ Te6edf3payloadTb4b4b4.Te6edf3contentHashCodeTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3result
Tb4b4b4}
Tb4b4b4}

Tff7b72internal Tff7b72class T56d364FountainReceiveStateTb4b4b4(
Tff7b72val Te6edf3transferIdTb4b4b4: Tffa657IntTb4b4b4, T8b949e// UInt24
Tff7b72val Te6edf3kTb4b4b4: Tffa657IntTb4b4b4,
Tff7b72val Te6edf3totalLengthTb4b4b4: Tffa657IntTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3blocks Tff7b72= Te6edf3mutableListOfTff7b72<Te6edf3FountainBlockTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3createdAt Tff7b72= Te6edf3ClockTb4b4b4.Te6edf3SystemTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toEpochMillisecondsTb4b4b4(Tb4b4b4)

Tff7b72fun Td2a8ffaddBlockTb4b4b4(Te6edf3blockTb4b4b4: Te6edf3FountainBlockTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3blocksTb4b4b4.Te6edf3none Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3seed Tff7b72=Tff7b72= Te6edf3blockTb4b4b4.Te6edf3seed Tb4b4b4}Tb4b4b4) Tb4b4b4{
Te6edf3blocksTb4b4b4.Te6edf3addTb4b4b4(Te6edf3blockTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72val Te6edf3isExpiredTb4b4b4: Tffa657Boolean
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Tb4b4b4(Te6edf3ClockTb4b4b4.Te6edf3SystemTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toEpochMillisecondsTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3createdAtTb4b4b4) Tff7b72> T79c0ff6T79c0ff0Te6edf3_000
Tb4b4b4}

Tff7b72internal Tff7b72data Tff7b72class T56d364FountainDataHeaderTb4b4b4(
Tff7b72val Te6edf3transferIdTb4b4b4: Tffa657IntTb4b4b4, T8b949e// UInt24
Tff7b72val Te6edf3seedTb4b4b4: Tffa657IntTb4b4b4, T8b949e// UInt16
Tff7b72val Te6edf3kTb4b4b4: Tffa657IntTb4b4b4, T8b949e// UInt8
Tff7b72val Te6edf3totalLengthTb4b4b4: Tffa657IntTb4b4b4, T8b949e// UInt16
Tb4b4b4)

Tff7b72internal Tff7b72data Tff7b72class T56d364FountainAckTb4b4b4(
Tff7b72val Te6edf3transferIdTb4b4b4: Tffa657IntTb4b4b4,
Tff7b72val Te6edf3typeTb4b4b4: Tffa657ByteTb4b4b4,
Tff7b72val Te6edf3receivedTb4b4b4: Tffa657IntTb4b4b4,
Tff7b72val Te6edf3neededTb4b4b4: Tffa657IntTb4b4b4,
Tff7b72val Te6edf3dataHashTb4b4b4: Te6edf3ByteArrayTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffequalsTb4b4b4(Te6edf3otherTb4b4b4: Tffa657Any?Tb4b4b4)Tb4b4b4: Tffa657Boolean Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72this Tff7b72=Tff7b72=Tff7b72= Te6edf3otherTb4b4b4) Tff7b72return Tff7b72true
Tff7b72if Tb4b4b4(Te6edf3other Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Tff7b72thisTff7b72::Tff7b72class != T56d364otherTff7b72::Te6edf3classTb4b4b4) Tff7b72return Tff7b72false
Te6edf3other Tff7b72as Te6edf3FountainAck
Tff7b72return Te6edf3transferId Tff7b72=Tff7b72= Te6edf3otherTb4b4b4.Te6edf3transferId Tff7b72&Tff7b72&
Te6edf3type Tff7b72=Tff7b72= Te6edf3otherTb4b4b4.Te6edf3type Tff7b72&Tff7b72&
Te6edf3received Tff7b72=Tff7b72= Te6edf3otherTb4b4b4.Te6edf3received Tff7b72&Tff7b72&
Te6edf3needed Tff7b72=Tff7b72= Te6edf3otherTb4b4b4.Te6edf3needed Tff7b72&Tff7b72&
Te6edf3dataHashTb4b4b4.Te6edf3contentEqualsTb4b4b4(Te6edf3otherTb4b4b4.Te6edf3dataHashTb4b4b4)
Tb4b4b4}

Tff7b72override Tff7b72fun Td2a8ffhashCodeTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657Int Tb4b4b4{
Tff7b72var Te6edf3result Tff7b72= Te6edf3transferId
Te6edf3result Tff7b72= T79c0ff3T79c0ff1 Tff7b72* Te6edf3result Tff7b72+ Te6edf3typeTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Te6edf3result Tff7b72= T79c0ff3T79c0ff1 Tff7b72* Te6edf3result Tff7b72+ Te6edf3received
Te6edf3result Tff7b72= T79c0ff3T79c0ff1 Tff7b72* Te6edf3result Tff7b72+ Te6edf3needed
Te6edf3result Tff7b72= T79c0ff3T79c0ff1 Tff7b72* Te6edf3result Tff7b72+ Te6edf3dataHashTb4b4b4.Te6edf3contentHashCodeTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3result
Tb4b4b4}
Tb4b4b4}

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4)
Tff7b72internal Tff7b72class T56d364JavaRandomTb4b4b4(Te6edf3seedTb4b4b4: Tffa657LongTb4b4b4) Tb4b4b4{
Tff7b72private Tff7b72var Te6edf3seedTb4b4b4: Tffa657Long Tff7b72= Tb4b4b4(Te6edf3seed Te6edf3xor T79c0ff0Te6edf3x5DEECE66DLTb4b4b4) Te6edf3and Tb4b4b4(Tb4b4b4(T79c0ff1L Te6edf3shl T79c0ff4T79c0ff8Tb4b4b4) Tff7b72- T79c0ff1Tb4b4b4)

Tff7b72private Tff7b72fun Td2a8ffnextTb4b4b4(Te6edf3bitsTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Tffa657Int Tb4b4b4{
Te6edf3seed Tff7b72= Tb4b4b4(Te6edf3seed Tff7b72* T79c0ff0Te6edf3x5DEECE66DL Tff7b72+ T79c0ff0Te6edf3xBLTb4b4b4) Te6edf3and Tb4b4b4(Tb4b4b4(T79c0ff1L Te6edf3shl T79c0ff4T79c0ff8Tb4b4b4) Tff7b72- T79c0ff1Tb4b4b4)
Tff7b72return Tb4b4b4(Te6edf3seed Te6edf3ushr Tb4b4b4(T79c0ff4T79c0ff8 Tff7b72- Te6edf3bitsTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Tb4b4b4}

Tff7b72fun Td2a8ffnextIntTb4b4b4(Te6edf3boundTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Tffa657Int Tff7b72= Tff7b72when Tb4b4b4{
Te6edf3bound Tff7b72<Tff7b72= T79c0ff0 Tff7b72-Tff7b72> T79c0ff0
Tb4b4b4(Te6edf3bound Te6edf3and Tff7b72-Te6edf3boundTb4b4b4) Tff7b72=Tff7b72= Te6edf3bound Tff7b72-Tff7b72> Tb4b4b4(Tb4b4b4(Te6edf3boundTb4b4b4.Te6edf3toLongTb4b4b4(Tb4b4b4) Tff7b72* Te6edf3nextTb4b4b4(T79c0ff3T79c0ff1Tb4b4b4)Tb4b4b4.Te6edf3toLongTb4b4b4(Tb4b4b4)Tb4b4b4) Te6edf3shr T79c0ff3T79c0ff1Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Tff7b72else Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72var Te6edf3bitsTb4b4b4: Tffa657Int
Tff7b72var Te6edf3valResultTb4b4b4: Tffa657Int
Tff7b72do Tb4b4b4{
Te6edf3bits Tff7b72= Te6edf3nextTb4b4b4(T79c0ff3T79c0ff1Tb4b4b4)
Te6edf3valResult Tff7b72= Te6edf3bits Tff7b72% Te6edf3bound
Tb4b4b4} Tff7b72while Tb4b4b4(Te6edf3bits Tff7b72- Te6edf3valResult Tff7b72+ Tb4b4b4(Te6edf3bound Tff7b72- T79c0ff1Tb4b4b4) Tff7b72< T79c0ff0Tb4b4b4)
Te6edf3valResult
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffnextDoubleTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657Double Tb4b4b4{
Tff7b72val Te6edf3high Tff7b72= Te6edf3nextTb4b4b4(T79c0ff2T79c0ff6Tb4b4b4)Tb4b4b4.Te6edf3toLongTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3low Tff7b72= Te6edf3nextTb4b4b4(T79c0ff2T79c0ff7Tb4b4b4)Tb4b4b4.Te6edf3toLongTb4b4b4(Tb4b4b4)
Tff7b72return Tb4b4b4(Tb4b4b4(Te6edf3high Te6edf3shl T79c0ff2T79c0ff7Tb4b4b4) Tff7b72+ Te6edf3lowTb4b4b4)Tb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4) Tff7b72/ Tb4b4b4(T79c0ff1L Te6edf3shl T79c0ff5T79c0ff3Tb4b4b4)Tb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTooManyFunctionsTa5d6ff"Tb4b4b4)
Tff7b72internal Tff7b72class T56d364FountainCodec Tb4b4b4{
Tff7b72private Tff7b72val Te6edf3receiveStates Tff7b72= Te6edf3mutableMapOfTff7b72<Tffa657IntTb4b4b4, Te6edf3FountainReceiveStateTff7b72>Tb4b4b4(Tb4b4b4)

Tff7b72fun Td2a8ffgenerateTransferIdTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657Int Tb4b4b4{
Tff7b72val Te6edf3random Tff7b72= Te6edf3RandomTb4b4b4.Te6edf3nextIntTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff0Te6edf3xFFFFFF Tff7b72+ T79c0ff1Tb4b4b4)
Tff7b72val Te6edf3time Tff7b72= Tb4b4b4(Te6edf3ClockTb4b4b4.Te6edf3SystemTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toEpochMillisecondsTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFFF
Tff7b72return Tb4b4b4(Te6edf3random Te6edf3xor Te6edf3timeTb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFFFFF
Tb4b4b4}

Tff7b72fun Td2a8ffencodeTb4b4b4(Te6edf3dataTb4b4b4: Te6edf3ByteArrayTb4b4b4, Te6edf3transferIdTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3ByteArrayTff7b72> Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3dataTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3w Tb4b4b4{ Ta5d6ff"Ta5d6ffFountain encode: empty dataTa5d6ff" Tb4b4b4}
Tff7b72return Te6edf3emptyListTb4b4b4(Tb4b4b4)
Tb4b4b4}

Tff7b72val Te6edf3k Tff7b72= Te6edf3maxOfTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3ceilTb4b4b4(Te6edf3dataTb4b4b4.Te6edf3sizeTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4) Tff7b72/ Te6edf3FountainConstantsTb4b4b4.Te6edf3BLOCK_SIZETb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3overhead Tff7b72= Te6edf3getAdaptiveOverheadTb4b4b4(Te6edf3kTb4b4b4)
Tff7b72val Te6edf3blocksToSend Tff7b72= Te6edf3maxOfTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3ceilTb4b4b4(Te6edf3kTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4) Tff7b72* Tb4b4b4(T79c0ff1.0 Tff7b72+ Te6edf3overheadTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72val Te6edf3sourceBlocks Tff7b72= Te6edf3splitIntoBlocksTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3kTb4b4b4)
Tff7b72val Te6edf3packets Tff7b72= Te6edf3mutableListOfTff7b72<Te6edf3ByteArrayTff7b72>Tb4b4b4(Tb4b4b4)

Tff7b72for Tb4b4b4(Te6edf3i Tff7b72in T79c0ff0 Te6edf3until Te6edf3blocksToSendTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3seed Tff7b72= Te6edf3generateSeedTb4b4b4(Te6edf3transferIdTb4b4b4, Te6edf3iTb4b4b4)
Tff7b72val Te6edf3indices Tff7b72= Te6edf3generateBlockIndicesTb4b4b4(Te6edf3seedTb4b4b4, Te6edf3kTb4b4b4, Te6edf3iTb4b4b4)

Tff7b72var Te6edf3blockPayload Tff7b72= Te6edf3ByteArrayTb4b4b4(Te6edf3FountainConstantsTb4b4b4.Te6edf3BLOCK_SIZETb4b4b4) Tb4b4b4{ T79c0ff0 Tb4b4b4}
Tff7b72for Tb4b4b4(Te6edf3idx Tff7b72in Te6edf3indicesTb4b4b4) Tb4b4b4{
Te6edf3blockPayload Tff7b72= Te6edf3xorTb4b4b4(Te6edf3blockPayloadTb4b4b4, Te6edf3sourceBlocksTff7b72[Te6edf3idxTff7b72]Tb4b4b4)
Tb4b4b4}

Tff7b72val Te6edf3packet Tff7b72= Te6edf3buildDataBlockTb4b4b4(Te6edf3transferIdTb4b4b4, Te6edf3seedTb4b4b4, Te6edf3kTb4b4b4, Te6edf3dataTb4b4b4.Te6edf3sizeTb4b4b4, Te6edf3blockPayloadTb4b4b4)
Te6edf3packetsTb4b4b4.Te6edf3addTb4b4b4(Te6edf3packetTb4b4b4)
Tb4b4b4}

Te6edf3LoggerTb4b4b4.Te6edf3i Tb4b4b4{ Ta5d6ff"Ta5d6ffFountain encode: Tffd700${Te6edf3dataTb4b4b4.Te6edf3sizeTffd700}Ta5d6ff bytes -> Tffd700$Te6edf3kTa5d6ff source blocks -> Tffd700$Te6edf3blocksToSendTa5d6ff packetsTa5d6ff" Tb4b4b4}
Tff7b72return Te6edf3packets
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffsplitIntoBlocksTb4b4b4(Te6edf3dataTb4b4b4: Te6edf3ByteArrayTb4b4b4, Te6edf3kTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3ByteArrayTff7b72> Tb4b4b4{
Tff7b72val Te6edf3blocks Tff7b72= Te6edf3mutableListOfTff7b72<Te6edf3ByteArrayTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72for Tb4b4b4(Te6edf3i Tff7b72in T79c0ff0 Te6edf3until Te6edf3kTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3start Tff7b72= Te6edf3i Tff7b72* Te6edf3FountainConstantsTb4b4b4.Te6edf3BLOCK_SIZE
Tff7b72val Te6edf3end Tff7b72= Te6edf3minOfTb4b4b4(Te6edf3start Tff7b72+ Te6edf3FountainConstantsTb4b4b4.Te6edf3BLOCK_SIZETb4b4b4, Te6edf3dataTb4b4b4.Te6edf3sizeTb4b4b4)

Tff7b72if Tb4b4b4(Te6edf3start Tff7b72< Te6edf3dataTb4b4b4.Te6edf3sizeTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3block Tff7b72= Te6edf3dataTb4b4b4.Te6edf3copyOfRangeTb4b4b4(Te6edf3startTb4b4b4, Te6edf3endTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3blockTb4b4b4.Te6edf3size Tff7b72< Te6edf3FountainConstantsTb4b4b4.Te6edf3BLOCK_SIZETb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3padded Tff7b72= Te6edf3ByteArrayTb4b4b4(Te6edf3FountainConstantsTb4b4b4.Te6edf3BLOCK_SIZETb4b4b4) Tb4b4b4{ T79c0ff0 Tb4b4b4}
Te6edf3blockTb4b4b4.Te6edf3copyIntoTb4b4b4(Te6edf3paddedTb4b4b4)
Te6edf3blocksTb4b4b4.Te6edf3addTb4b4b4(Te6edf3paddedTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3blocksTb4b4b4.Te6edf3addTb4b4b4(Te6edf3blockTb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3blocksTb4b4b4.Te6edf3addTb4b4b4(Te6edf3ByteArrayTb4b4b4(Te6edf3FountainConstantsTb4b4b4.Te6edf3BLOCK_SIZETb4b4b4) Tb4b4b4{ T79c0ff0 Tb4b4b4}Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3blocks
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffbuildDataBlockTb4b4b4(Te6edf3transferIdTb4b4b4: Tffa657IntTb4b4b4, Te6edf3seedTb4b4b4: Tffa657IntTb4b4b4, Te6edf3kTb4b4b4: Tffa657IntTb4b4b4, Te6edf3totalLengthTb4b4b4: Tffa657IntTb4b4b4, Te6edf3payloadTb4b4b4: Te6edf3ByteArrayTb4b4b4)Tb4b4b4: Te6edf3ByteArray Tb4b4b4{
Tff7b72val Te6edf3packet Tff7b72= Te6edf3ByteArrayTb4b4b4(Te6edf3FountainConstantsTb4b4b4.Te6edf3DATA_HEADER_SIZE Tff7b72+ Te6edf3payloadTb4b4b4.Te6edf3sizeTb4b4b4)

Te6edf3packetTff7b72[T79c0ff0Tff7b72] Tff7b72= Te6edf3FountainConstantsTb4b4b4.Te6edf3MAGICTff7b72[T79c0ff0Tff7b72]
Te6edf3packetTff7b72[T79c0ff1Tff7b72] Tff7b72= Te6edf3FountainConstantsTb4b4b4.Te6edf3MAGICTff7b72[T79c0ff1Tff7b72]
Te6edf3packetTff7b72[T79c0ff2Tff7b72] Tff7b72= Te6edf3FountainConstantsTb4b4b4.Te6edf3MAGICTff7b72[T79c0ff2Tff7b72]

Te6edf3packetTff7b72[T79c0ff3Tff7b72] Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3transferId Te6edf3shr T79c0ff1T79c0ff6Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4)Tb4b4b4.Te6edf3toByteTb4b4b4(Tb4b4b4)
Te6edf3packetTff7b72[T79c0ff4Tff7b72] Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3transferId Te6edf3shr T79c0ff8Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4)Tb4b4b4.Te6edf3toByteTb4b4b4(Tb4b4b4)
Te6edf3packetTff7b72[T79c0ff5Tff7b72] Tff7b72= Tb4b4b4(Te6edf3transferId Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4)Tb4b4b4.Te6edf3toByteTb4b4b4(Tb4b4b4)

Te6edf3packetTff7b72[T79c0ff6Tff7b72] Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3seed Te6edf3shr T79c0ff8Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4)Tb4b4b4.Te6edf3toByteTb4b4b4(Tb4b4b4)
Te6edf3packetTff7b72[T79c0ff7Tff7b72] Tff7b72= Tb4b4b4(Te6edf3seed Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4)Tb4b4b4.Te6edf3toByteTb4b4b4(Tb4b4b4)

Te6edf3packetTff7b72[T79c0ff8Tff7b72] Tff7b72= Tb4b4b4(Te6edf3k Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4)Tb4b4b4.Te6edf3toByteTb4b4b4(Tb4b4b4)

Te6edf3packetTff7b72[T79c0ff9Tff7b72] Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3totalLength Te6edf3shr T79c0ff8Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4)Tb4b4b4.Te6edf3toByteTb4b4b4(Tb4b4b4)
Te6edf3packetTff7b72[T79c0ff1T79c0ff0Tff7b72] Tff7b72= Tb4b4b4(Te6edf3totalLength Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4)Tb4b4b4.Te6edf3toByteTb4b4b4(Tb4b4b4)

Te6edf3payloadTb4b4b4.Te6edf3copyIntoTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3FountainConstantsTb4b4b4.Te6edf3DATA_HEADER_SIZETb4b4b4)
Tff7b72return Te6edf3packet
Tb4b4b4}

Tff7b72fun Td2a8ffisFountainPacketTb4b4b4(Te6edf3dataTb4b4b4: Te6edf3ByteArrayTb4b4b4)Tb4b4b4: Tffa657Boolean Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3dataTb4b4b4.Te6edf3size Tff7b72< T79c0ff3Tb4b4b4) Tff7b72return Tff7b72false
Tff7b72return Te6edf3dataTff7b72[T79c0ff0Tff7b72] Tff7b72=Tff7b72= Te6edf3FountainConstantsTb4b4b4.Te6edf3MAGICTff7b72[T79c0ff0Tff7b72] Tff7b72&Tff7b72&
Te6edf3dataTff7b72[T79c0ff1Tff7b72] Tff7b72=Tff7b72= Te6edf3FountainConstantsTb4b4b4.Te6edf3MAGICTff7b72[T79c0ff1Tff7b72] Tff7b72&Tff7b72&
Te6edf3dataTff7b72[T79c0ff2Tff7b72] Tff7b72=Tff7b72= Te6edf3FountainConstantsTb4b4b4.Te6edf3MAGICTff7b72[T79c0ff2Tff7b72]
Tb4b4b4}

Tff7b72fun Td2a8ffparseDataHeaderTb4b4b4(Te6edf3dataTb4b4b4: Te6edf3ByteArrayTb4b4b4)Tb4b4b4: Te6edf3FountainDataHeader? Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3dataTb4b4b4.Te6edf3size Tff7b72< Te6edf3FountainConstantsTb4b4b4.Te6edf3DATA_HEADER_SIZE Tff7b72|Tff7b72| Tff7b72!Te6edf3isFountainPacketTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4) Tff7b72return Tff7b72null

Tff7b72val Te6edf3transferId Tff7b72=
Tb4b4b4(Tb4b4b4(Te6edf3dataTff7b72[T79c0ff3Tff7b72]Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4) Te6edf3shl T79c0ff1T79c0ff6Tb4b4b4) Te6edf3or Tb4b4b4(Tb4b4b4(Te6edf3dataTff7b72[T79c0ff4Tff7b72]Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4) Te6edf3shl T79c0ff8Tb4b4b4) Te6edf3or Tb4b4b4(Te6edf3dataTff7b72[T79c0ff5Tff7b72]Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4)
Tff7b72val Te6edf3seed Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3dataTff7b72[T79c0ff6Tff7b72]Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4) Te6edf3shl T79c0ff8Tb4b4b4) Te6edf3or Tb4b4b4(Te6edf3dataTff7b72[T79c0ff7Tff7b72]Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4)
Tff7b72val Te6edf3k Tff7b72= Te6edf3dataTff7b72[T79c0ff8Tff7b72]Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFF
Tff7b72val Te6edf3totalLength Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3dataTff7b72[T79c0ff9Tff7b72]Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4) Te6edf3shl T79c0ff8Tb4b4b4) Te6edf3or Tb4b4b4(Te6edf3dataTff7b72[T79c0ff1T79c0ff0Tff7b72]Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4)

Tff7b72return Te6edf3FountainDataHeaderTb4b4b4(Te6edf3transferIdTb4b4b4, Te6edf3seedTb4b4b4, Te6edf3kTb4b4b4, Te6edf3totalLengthTb4b4b4)
Tb4b4b4}

Tff7b72fun Td2a8ffhandleIncomingPacketTb4b4b4(Te6edf3dataTb4b4b4: Te6edf3ByteArrayTb4b4b4)Tb4b4b4: Te6edf3PairTff7b72<Te6edf3ByteArrayTb4b4b4, Tffa657IntTff7b72>Tff7b72? Tb4b4b4{
Te6edf3cleanupExpiredStatesTb4b4b4(Tb4b4b4)

Tff7b72val Te6edf3header Tff7b72= Te6edf3parseDataHeaderTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3header Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3payload Tff7b72= Te6edf3dataTb4b4b4.Te6edf3copyOfRangeTb4b4b4(Te6edf3FountainConstantsTb4b4b4.Te6edf3DATA_HEADER_SIZETb4b4b4, Te6edf3dataTb4b4b4.Te6edf3sizeTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3payloadTb4b4b4.Te6edf3size Tff7b72=Tff7b72= Te6edf3FountainConstantsTb4b4b4.Te6edf3BLOCK_SIZETb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3processValidIncomingPacketTb4b4b4(Te6edf3headerTb4b4b4, Te6edf3payloadTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3w Tb4b4b4{ Ta5d6ff"Ta5d6ffInvalid fountain payload size: Tffd700${Te6edf3payloadTb4b4b4.Te6edf3sizeTffd700}Ta5d6ff" Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72return Tff7b72null
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffprocessValidIncomingPacketTb4b4b4(Te6edf3headerTb4b4b4: Te6edf3FountainDataHeaderTb4b4b4, Te6edf3payloadTb4b4b4: Te6edf3ByteArrayTb4b4b4)Tb4b4b4: Te6edf3PairTff7b72<Te6edf3ByteArrayTb4b4b4, Tffa657IntTff7b72>Tff7b72? Tb4b4b4{
Tff7b72val Te6edf3state Tff7b72=
Te6edf3receiveStatesTb4b4b4.Te6edf3getOrPutTb4b4b4(Te6edf3headerTb4b4b4.Te6edf3transferIdTb4b4b4) Tb4b4b4{
Te6edf3FountainReceiveStateTb4b4b4(Te6edf3headerTb4b4b4.Te6edf3transferIdTb4b4b4, Te6edf3headerTb4b4b4.Te6edf3kTb4b4b4, Te6edf3headerTb4b4b4.Te6edf3totalLengthTb4b4b4)
Tb4b4b4}

Tff7b72val Te6edf3indices Tff7b72= Te6edf3regenerateIndicesTb4b4b4(Te6edf3headerTb4b4b4.Te6edf3seedTb4b4b4, Te6edf3stateTb4b4b4.Te6edf3kTb4b4b4, Te6edf3headerTb4b4b4.Te6edf3transferIdTb4b4b4)
Tff7b72val Te6edf3block Tff7b72= Te6edf3FountainBlockTb4b4b4(Te6edf3headerTb4b4b4.Te6edf3seedTb4b4b4, Te6edf3indicesTb4b4b4.Te6edf3toMutableSetTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3payloadTb4b4b4)
Te6edf3stateTb4b4b4.Te6edf3addBlockTb4b4b4(Te6edf3blockTb4b4b4)

Tff7b72if Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3blocksTb4b4b4.Te6edf3size Tff7b72>Tff7b72= Te6edf3stateTb4b4b4.Te6edf3kTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3decoded Tff7b72= Te6edf3peelingDecodeTb4b4b4(Te6edf3stateTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3decoded Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3receiveStatesTb4b4b4.Te6edf3removeTb4b4b4(Te6edf3headerTb4b4b4.Te6edf3transferIdTb4b4b4)
Te6edf3LoggerTb4b4b4.Te6edf3i Tb4b4b4{ Ta5d6ff"Ta5d6ffFountain decode complete: Tffd700${Te6edf3decodedTb4b4b4.Te6edf3sizeTffd700}Ta5d6ff bytes from Tffd700${Te6edf3stateTb4b4b4.Te6edf3blocksTb4b4b4.Te6edf3sizeTffd700}Ta5d6ff blocksTa5d6ff" Tb4b4b4}
Tff7b72return Te6edf3PairTb4b4b4(Te6edf3decodedTb4b4b4, Te6edf3headerTb4b4b4.Te6edf3transferIdTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72return Tff7b72null
Tb4b4b4}

Tff7b72fun Td2a8ffbuildAckTb4b4b4(Te6edf3transferIdTb4b4b4: Tffa657IntTb4b4b4, Te6edf3typeTb4b4b4: Tffa657ByteTb4b4b4, Te6edf3receivedTb4b4b4: Tffa657IntTb4b4b4, Te6edf3neededTb4b4b4: Tffa657IntTb4b4b4, Te6edf3dataHashTb4b4b4: Te6edf3ByteArrayTb4b4b4)Tb4b4b4: Te6edf3ByteArray Tb4b4b4{
Tff7b72val Te6edf3packet Tff7b72= Te6edf3ByteArrayTb4b4b4(Te6edf3FountainConstantsTb4b4b4.Te6edf3ACK_PACKET_SIZETb4b4b4)

Te6edf3packetTff7b72[T79c0ff0Tff7b72] Tff7b72= Te6edf3FountainConstantsTb4b4b4.Te6edf3MAGICTff7b72[T79c0ff0Tff7b72]
Te6edf3packetTff7b72[T79c0ff1Tff7b72] Tff7b72= Te6edf3FountainConstantsTb4b4b4.Te6edf3MAGICTff7b72[T79c0ff1Tff7b72]
Te6edf3packetTff7b72[T79c0ff2Tff7b72] Tff7b72= Te6edf3FountainConstantsTb4b4b4.Te6edf3MAGICTff7b72[T79c0ff2Tff7b72]

Te6edf3packetTff7b72[T79c0ff3Tff7b72] Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3transferId Te6edf3shr T79c0ff1T79c0ff6Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4)Tb4b4b4.Te6edf3toByteTb4b4b4(Tb4b4b4)
Te6edf3packetTff7b72[T79c0ff4Tff7b72] Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3transferId Te6edf3shr T79c0ff8Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4)Tb4b4b4.Te6edf3toByteTb4b4b4(Tb4b4b4)
Te6edf3packetTff7b72[T79c0ff5Tff7b72] Tff7b72= Tb4b4b4(Te6edf3transferId Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4)Tb4b4b4.Te6edf3toByteTb4b4b4(Tb4b4b4)

Te6edf3packetTff7b72[T79c0ff6Tff7b72] Tff7b72= Te6edf3type

Te6edf3packetTff7b72[T79c0ff7Tff7b72] Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3received Te6edf3shr T79c0ff8Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4)Tb4b4b4.Te6edf3toByteTb4b4b4(Tb4b4b4)
Te6edf3packetTff7b72[T79c0ff8Tff7b72] Tff7b72= Tb4b4b4(Te6edf3received Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4)Tb4b4b4.Te6edf3toByteTb4b4b4(Tb4b4b4)

Te6edf3packetTff7b72[T79c0ff9Tff7b72] Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3needed Te6edf3shr T79c0ff8Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4)Tb4b4b4.Te6edf3toByteTb4b4b4(Tb4b4b4)
Te6edf3packetTff7b72[T79c0ff1T79c0ff0Tff7b72] Tff7b72= Tb4b4b4(Te6edf3needed Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4)Tb4b4b4.Te6edf3toByteTb4b4b4(Tb4b4b4)

Tff7b72val Te6edf3hashLen Tff7b72= Te6edf3minOfTb4b4b4(T79c0ff8Tb4b4b4, Te6edf3dataHashTb4b4b4.Te6edf3sizeTb4b4b4)
Te6edf3dataHashTb4b4b4.Te6edf3copyIntoTb4b4b4(Te6edf3packetTb4b4b4, T79c0ff1T79c0ff1Tb4b4b4, T79c0ff0Tb4b4b4, Te6edf3hashLenTb4b4b4)

Tff7b72return Te6edf3packet
Tb4b4b4}

Tff7b72fun Td2a8ffparseAckTb4b4b4(Te6edf3dataTb4b4b4: Te6edf3ByteArrayTb4b4b4)Tb4b4b4: Te6edf3FountainAck? Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3dataTb4b4b4.Te6edf3size Tff7b72< Te6edf3FountainConstantsTb4b4b4.Te6edf3ACK_PACKET_SIZE Tff7b72|Tff7b72| Tff7b72!Te6edf3isFountainPacketTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4) Tff7b72return Tff7b72null

Tff7b72val Te6edf3transferId Tff7b72=
Tb4b4b4(Tb4b4b4(Te6edf3dataTff7b72[T79c0ff3Tff7b72]Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4) Te6edf3shl T79c0ff1T79c0ff6Tb4b4b4) Te6edf3or Tb4b4b4(Tb4b4b4(Te6edf3dataTff7b72[T79c0ff4Tff7b72]Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4) Te6edf3shl T79c0ff8Tb4b4b4) Te6edf3or Tb4b4b4(Te6edf3dataTff7b72[T79c0ff5Tff7b72]Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4)
Tff7b72val Te6edf3type Tff7b72= Te6edf3dataTff7b72[T79c0ff6Tff7b72]
Tff7b72val Te6edf3received Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3dataTff7b72[T79c0ff7Tff7b72]Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4) Te6edf3shl T79c0ff8Tb4b4b4) Te6edf3or Tb4b4b4(Te6edf3dataTff7b72[T79c0ff8Tff7b72]Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4)
Tff7b72val Te6edf3needed Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3dataTff7b72[T79c0ff9Tff7b72]Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4) Te6edf3shl T79c0ff8Tb4b4b4) Te6edf3or Tb4b4b4(Te6edf3dataTff7b72[T79c0ff1T79c0ff0Tff7b72]Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) Te6edf3and T79c0ff0Te6edf3xFFTb4b4b4)
Tff7b72val Te6edf3dataHash Tff7b72= Te6edf3dataTb4b4b4.Te6edf3copyOfRangeTb4b4b4(T79c0ff1T79c0ff1Tb4b4b4, T79c0ff1T79c0ff9Tb4b4b4)

Tff7b72return Te6edf3FountainAckTb4b4b4(Te6edf3transferIdTb4b4b4, Te6edf3typeTb4b4b4, Te6edf3receivedTb4b4b4, Te6edf3neededTb4b4b4, Te6edf3dataHashTb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffpeelingDecodeTb4b4b4(Te6edf3stateTb4b4b4: Te6edf3FountainReceiveStateTb4b4b4)Tb4b4b4: Te6edf3ByteArray? Tb4b4b4{
Tff7b72val Te6edf3decoded Tff7b72= Te6edf3mutableMapOfTff7b72<Tffa657IntTb4b4b4, Te6edf3ByteArrayTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3workingBlocks Tff7b72=
Te6edf3stateTb4b4b4.Te6edf3blocksTb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3FountainBlockTb4b4b4(Tffa657itTb4b4b4.Te6edf3seedTb4b4b4, Tffa657itTb4b4b4.Te6edf3indicesTb4b4b4.Te6edf3toMutableSetTb4b4b4(Tb4b4b4)Tb4b4b4, Tffa657itTb4b4b4.Te6edf3payloadTb4b4b4.Te6edf3copyOfTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}Tb4b4b4.Te6edf3toMutableListTb4b4b4(Tb4b4b4)

Tff7b72var Te6edf3progress Tff7b72= Tff7b72true
Tff7b72while Tb4b4b4(Te6edf3progress Tff7b72&Tff7b72& Te6edf3decodedTb4b4b4.Te6edf3size Tff7b72< Te6edf3stateTb4b4b4.Te6edf3kTb4b4b4) Tb4b4b4{
Te6edf3progress Tff7b72= Te6edf3processWorkingBlocksTb4b4b4(Te6edf3workingBlocksTb4b4b4, Te6edf3decodedTb4b4b4)
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3decodedTb4b4b4.Te6edf3size Tff7b72< Te6edf3stateTb4b4b4.Te6edf3kTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Ta5d6ffPeeling decode incomplete: Tffd700${Te6edf3decodedTb4b4b4.Te6edf3sizeTffd700}Ta5d6ff/Tffd700${Te6edf3stateTb4b4b4.Te6edf3kTffd700}Ta5d6ff blocks decodedTa5d6ff" Tb4b4b4}
Tff7b72return Tff7b72null
Tb4b4b4}
Tff7b72return Te6edf3assembleDecodedDataTb4b4b4(Te6edf3stateTb4b4b4, Te6edf3decodedTb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffprocessWorkingBlocksTb4b4b4(Te6edf3workingBlocksTb4b4b4: Te6edf3ListTff7b72<Te6edf3FountainBlockTff7b72>Tb4b4b4, Te6edf3decodedTb4b4b4: Te6edf3MutableMapTff7b72<Tffa657IntTb4b4b4, Te6edf3ByteArrayTff7b72>Tb4b4b4)Tb4b4b4: Tffa657Boolean Tb4b4b4{
Tff7b72var Te6edf3progress Tff7b72= Tff7b72false
Tff7b72for Tb4b4b4(Te6edf3i Tff7b72in Te6edf3workingBlocksTb4b4b4.Te6edf3indicesTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3block Tff7b72= Te6edf3workingBlocksTff7b72[Te6edf3iTff7b72]
Tff7b72val Te6edf3toRemove Tff7b72= Te6edf3mutableListOfTff7b72<Tffa657IntTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72for Tb4b4b4(Te6edf3idx Tff7b72in Te6edf3blockTb4b4b4.Te6edf3indicesTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3decodedBlock Tff7b72= Te6edf3decodedTff7b72[Te6edf3idxTff7b72]
Tff7b72if Tb4b4b4(Te6edf3decodedBlock Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3blockTb4b4b4.Te6edf3payload Tff7b72= Te6edf3xorTb4b4b4(Te6edf3blockTb4b4b4.Te6edf3payloadTb4b4b4, Te6edf3decodedBlockTb4b4b4)
Te6edf3toRemoveTb4b4b4.Te6edf3addTb4b4b4(Te6edf3idxTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3blockTb4b4b4.Te6edf3indicesTb4b4b4.Te6edf3removeAllTb4b4b4(Te6edf3toRemoveTb4b4b4)

Tff7b72if Tb4b4b4(Te6edf3blockTb4b4b4.Te6edf3indicesTb4b4b4.Te6edf3size Tff7b72=Tff7b72= T79c0ff1Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3idx Tff7b72= Te6edf3blockTb4b4b4.Te6edf3indicesTb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3decodedTb4b4b4.Te6edf3containsKeyTb4b4b4(Te6edf3idxTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3decodedTff7b72[Te6edf3idxTff7b72] Tff7b72= Te6edf3blockTb4b4b4.Te6edf3payload
Te6edf3progress Tff7b72= Tff7b72true
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3progress
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffassembleDecodedDataTb4b4b4(Te6edf3stateTb4b4b4: Te6edf3FountainReceiveStateTb4b4b4, Te6edf3decodedTb4b4b4: Te6edf3MapTff7b72<Tffa657IntTb4b4b4, Te6edf3ByteArrayTff7b72>Tb4b4b4)Tb4b4b4: Te6edf3ByteArray? Tb4b4b4{
Tff7b72val Te6edf3result Tff7b72= Te6edf3ByteArrayTb4b4b4(Te6edf3stateTb4b4b4.Te6edf3k Tff7b72* Te6edf3FountainConstantsTb4b4b4.Te6edf3BLOCK_SIZETb4b4b4)
Tff7b72for Tb4b4b4(Te6edf3i Tff7b72in T79c0ff0 Te6edf3until Te6edf3stateTb4b4b4.Te6edf3kTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3block Tff7b72= Te6edf3decodedTff7b72[Te6edf3iTff7b72] Tff7b72?: Tff7b72return Tff7b72null
Te6edf3blockTb4b4b4.Te6edf3copyIntoTb4b4b4(Te6edf3resultTb4b4b4, Te6edf3i Tff7b72* Te6edf3FountainConstantsTb4b4b4.Te6edf3BLOCK_SIZETb4b4b4)
Tb4b4b4}
Tff7b72return Te6edf3resultTb4b4b4.Te6edf3copyOfRangeTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3stateTb4b4b4.Te6edf3totalLengthTb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffcleanupExpiredStatesTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3expiredIds Tff7b72= Te6edf3receiveStatesTb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3isExpired Tb4b4b4}Tb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3key Tb4b4b4}
Tff7b72for Tb4b4b4(Te6edf3id Tff7b72in Te6edf3expiredIdsTb4b4b4) Tb4b4b4{
Te6edf3receiveStatesTb4b4b4.Te6edf3removeTb4b4b4(Te6edf3idTb4b4b4)
Te6edf3LoggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Ta5d6ffCleaned up expired fountain state: Tffd700$Te6edf3idTa5d6ff" Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffgetAdaptiveOverheadTb4b4b4(Te6edf3kTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Tffa657Double Tff7b72= Tff7b72when Tb4b4b4{
Te6edf3k Tff7b72<Tff7b72= T79c0ff1T79c0ff0 Tff7b72-Tff7b72> T79c0ff0.50
Te6edf3k Tff7b72<Tff7b72= T79c0ff5T79c0ff0 Tff7b72-Tff7b72> T79c0ff0.25
Tff7b72else Tff7b72-Tff7b72> T79c0ff0.15
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffgenerateSeedTb4b4b4(Te6edf3transferIdTb4b4b4: Tffa657IntTb4b4b4, Te6edf3blockIndexTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Tffa657Int Tb4b4b4{
Tff7b72val Te6edf3combined Tff7b72= Te6edf3transferId Tff7b72* T79c0ff3T79c0ff1T79c0ff3T79c0ff3T79c0ff7 Tff7b72+ Te6edf3blockIndex Tff7b72* T79c0ff7T79c0ff9T79c0ff1T79c0ff9
Tff7b72return Te6edf3combined Te6edf3and T79c0ff0Te6edf3xFFFF
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffgenerateBlockIndicesTb4b4b4(Te6edf3seedTb4b4b4: Tffa657IntTb4b4b4, Te6edf3kTb4b4b4: Tffa657IntTb4b4b4, Te6edf3blockIndexTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Te6edf3SetTff7b72<Tffa657IntTff7b72> Tb4b4b4{
Tff7b72val Te6edf3rng Tff7b72= Te6edf3JavaRandomTb4b4b4(Te6edf3seedTb4b4b4.Te6edf3toLongTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3sampledDegree Tff7b72= Te6edf3sampleRobustSolitonDegreeTb4b4b4(Te6edf3rngTb4b4b4, Te6edf3kTb4b4b4)
Tff7b72val Te6edf3degree Tff7b72= Tff7b72if Tb4b4b4(Te6edf3blockIndex Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) T79c0ff1 Tff7b72else Te6edf3sampledDegree
Tff7b72return Te6edf3selectIndicesTb4b4b4(Te6edf3rngTb4b4b4, Te6edf3kTb4b4b4, Te6edf3degreeTb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffregenerateIndicesTb4b4b4(Te6edf3seedTb4b4b4: Tffa657IntTb4b4b4, Te6edf3kTb4b4b4: Tffa657IntTb4b4b4, Te6edf3transferIdTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Te6edf3SetTff7b72<Tffa657IntTff7b72> Tb4b4b4{
Tff7b72val Te6edf3rng Tff7b72= Te6edf3JavaRandomTb4b4b4(Te6edf3seedTb4b4b4.Te6edf3toLongTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3sampledDegree Tff7b72= Te6edf3sampleRobustSolitonDegreeTb4b4b4(Te6edf3rngTb4b4b4, Te6edf3kTb4b4b4)
Tff7b72val Te6edf3expectedSeed0 Tff7b72= Te6edf3generateSeedTb4b4b4(Te6edf3transferIdTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72val Te6edf3degree Tff7b72= Tff7b72if Tb4b4b4(Te6edf3seed Tff7b72=Tff7b72= Te6edf3expectedSeed0Tb4b4b4) T79c0ff1 Tff7b72else Te6edf3sampledDegree
Tff7b72return Te6edf3selectIndicesTb4b4b4(Te6edf3rngTb4b4b4, Te6edf3kTb4b4b4, Te6edf3degreeTb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffselectIndicesTb4b4b4(Te6edf3rngTb4b4b4: Te6edf3JavaRandomTb4b4b4, Te6edf3kTb4b4b4: Tffa657IntTb4b4b4, Te6edf3degreeTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Te6edf3SetTff7b72<Tffa657IntTff7b72> Tb4b4b4{
Tff7b72val Te6edf3indices Tff7b72= Te6edf3mutableSetOfTff7b72<Tffa657IntTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72while Tb4b4b4(Te6edf3indicesTb4b4b4.Te6edf3size Tff7b72< Te6edf3degree Tff7b72&Tff7b72& Te6edf3indicesTb4b4b4.Te6edf3size Tff7b72< Te6edf3kTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3idx Tff7b72= Te6edf3rngTb4b4b4.Te6edf3nextIntTb4b4b4(Te6edf3kTb4b4b4)
Te6edf3indicesTb4b4b4.Te6edf3addTb4b4b4(Te6edf3idxTb4b4b4)
Tb4b4b4}
Tff7b72return Te6edf3indices
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffsampleRobustSolitonDegreeTb4b4b4(Te6edf3rngTb4b4b4: Te6edf3JavaRandomTb4b4b4, Te6edf3kTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Tffa657Int Tb4b4b4{
Tff7b72val Te6edf3cdf Tff7b72= Te6edf3buildRobustSolitonCDFTb4b4b4(Te6edf3kTb4b4b4)
Tff7b72val Te6edf3u Tff7b72= Te6edf3rngTb4b4b4.Te6edf3nextDoubleTb4b4b4(Tb4b4b4)
Tff7b72for Tb4b4b4(Te6edf3d Tff7b72in T79c0ff1.Tb4b4b4.Te6edf3kTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3u Tff7b72<Tff7b72= Te6edf3cdfTff7b72[Te6edf3dTff7b72]Tb4b4b4) Tff7b72return Te6edf3d
Tb4b4b4}
Tff7b72return Te6edf3k
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffbuildRobustSolitonCDFTb4b4b4(Te6edf3kTb4b4b4: Tffa657IntTb4b4b4, Te6edf3cTb4b4b4: Tffa657Double Tff7b72= T79c0ff0.1Tb4b4b4, Te6edf3deltaTb4b4b4: Tffa657Double Tff7b72= T79c0ff0.5Tb4b4b4)Tb4b4b4: Te6edf3DoubleArray Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3k Tff7b72<Tff7b72= T79c0ff0Tb4b4b4) Tff7b72return Te6edf3doubleArrayOfTb4b4b4(T79c0ff1.0Tb4b4b4)

Tff7b72val Te6edf3rho Tff7b72= Te6edf3DoubleArrayTb4b4b4(Te6edf3k Tff7b72+ T79c0ff1Tb4b4b4)
Te6edf3rhoTff7b72[T79c0ff1Tff7b72] Tff7b72= T79c0ff1.0 Tff7b72/ Te6edf3kTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4)
Tff7b72for Tb4b4b4(Te6edf3d Tff7b72in T79c0ff2.Tb4b4b4.Te6edf3kTb4b4b4) Tb4b4b4{
Te6edf3rhoTff7b72[Te6edf3dTff7b72] Tff7b72= T79c0ff1.0 Tff7b72/ Tb4b4b4(Te6edf3dTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4) Tff7b72* Tb4b4b4(Te6edf3d Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Tff7b72val Te6edf3rVal Tff7b72= Te6edf3c Tff7b72* Te6edf3lnTb4b4b4(Te6edf3kTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4) Tff7b72/ Te6edf3deltaTb4b4b4) Tff7b72* Te6edf3sqrtTb4b4b4(Te6edf3kTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3tau Tff7b72= Te6edf3DoubleArrayTb4b4b4(Te6edf3k Tff7b72+ T79c0ff1Tb4b4b4)
Tff7b72val Te6edf3threshold Tff7b72= Tb4b4b4(Te6edf3kTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4) Tff7b72/ Te6edf3rValTb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)

Tff7b72for Tb4b4b4(Te6edf3d Tff7b72in T79c0ff1.Tb4b4b4.Te6edf3kTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3d Tff7b72< Te6edf3thresholdTb4b4b4) Tb4b4b4{
Te6edf3tauTff7b72[Te6edf3dTff7b72] Tff7b72= Te6edf3rVal Tff7b72/ Tb4b4b4(Te6edf3dTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4) Tff7b72* Te6edf3kTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3d Tff7b72=Tff7b72= Te6edf3thresholdTb4b4b4) Tb4b4b4{
Te6edf3tauTff7b72[Te6edf3dTff7b72] Tff7b72= Te6edf3rVal Tff7b72* Te6edf3lnTb4b4b4(Te6edf3rVal Tff7b72/ Te6edf3deltaTb4b4b4) Tff7b72/ Te6edf3kTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72val Te6edf3mu Tff7b72= Te6edf3DoubleArrayTb4b4b4(Te6edf3k Tff7b72+ T79c0ff1Tb4b4b4)
Tff7b72var Te6edf3sum Tff7b72= T79c0ff0.0
Tff7b72for Tb4b4b4(Te6edf3d Tff7b72in T79c0ff1.Tb4b4b4.Te6edf3kTb4b4b4) Tb4b4b4{
Te6edf3muTff7b72[Te6edf3dTff7b72] Tff7b72= Te6edf3rhoTff7b72[Te6edf3dTff7b72] Tff7b72+ Te6edf3tauTff7b72[Te6edf3dTff7b72]
Te6edf3sum Tff7b72+Tff7b72= Te6edf3muTff7b72[Te6edf3dTff7b72]
Tb4b4b4}

Tff7b72val Te6edf3cdf Tff7b72= Te6edf3DoubleArrayTb4b4b4(Te6edf3k Tff7b72+ T79c0ff1Tb4b4b4)
Tff7b72var Te6edf3cumulative Tff7b72= T79c0ff0.0
Tff7b72for Tb4b4b4(Te6edf3d Tff7b72in T79c0ff1.Tb4b4b4.Te6edf3kTb4b4b4) Tb4b4b4{
Te6edf3cumulative Tff7b72+Tff7b72= Te6edf3muTff7b72[Te6edf3dTff7b72] Tff7b72/ Te6edf3sum
Te6edf3cdfTff7b72[Te6edf3dTff7b72] Tff7b72= Te6edf3cumulative
Tb4b4b4}
Tff7b72return Te6edf3cdf
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffxorTb4b4b4(Te6edf3aTb4b4b4: Te6edf3ByteArrayTb4b4b4, Te6edf3bTb4b4b4: Te6edf3ByteArrayTb4b4b4)Tb4b4b4: Te6edf3ByteArray Tb4b4b4{
Tff7b72val Te6edf3result Tff7b72= Te6edf3ByteArrayTb4b4b4(Te6edf3maxOfTb4b4b4(Te6edf3aTb4b4b4.Te6edf3sizeTb4b4b4, Te6edf3bTb4b4b4.Te6edf3sizeTb4b4b4)Tb4b4b4)
Tff7b72for Tb4b4b4(Te6edf3i Tff7b72in Te6edf3resultTb4b4b4.Te6edf3indicesTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3byteA Tff7b72= Tff7b72if Tb4b4b4(Te6edf3i Tff7b72< Te6edf3aTb4b4b4.Te6edf3sizeTb4b4b4) Te6edf3aTff7b72[Te6edf3iTff7b72] Tff7b72else T79c0ff0
Tff7b72val Te6edf3byteB Tff7b72= Tff7b72if Tb4b4b4(Te6edf3i Tff7b72< Te6edf3bTb4b4b4.Te6edf3sizeTb4b4b4) Te6edf3bTff7b72[Te6edf3iTff7b72] Tff7b72else T79c0ff0
Te6edf3resultTff7b72[Te6edf3iTff7b72] Tff7b72= Tb4b4b4(Te6edf3byteATb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) Te6edf3xor Te6edf3byteBTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toByteTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72return Te6edf3result
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.2 - Generated in 0.3s